package negocio.beans;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import negocio.daos.DisciplinaDAO;
import negocio.entidades.Disciplina;
import negocio.entidades.Usuario;
import negocio.excecoes.EditeDisciplinaEncerradaException;
import negocio.facades.DisciplinaRemote;
import negocio.util.Settings;

/**
 * Session Bean implementation class DisciplinaBean
 */
@Stateless
@LocalBean
public class DisciplinaBean implements DisciplinaRemote {
	@PersistenceContext(unitName = "banco")
	private EntityManager em;

	/**
	 * Default constructor.
	 */
	public DisciplinaBean() {
	}

	@Override
	public Disciplina salvar(Disciplina d) throws Exception {
		DisciplinaDAO dao = new DisciplinaDAO(em);
		dao.salvar(d);
		return d;
	}

	@Override
	public void excluir(long id) throws Exception {
		DisciplinaDAO dao = new DisciplinaDAO(em);
		dao.excluir(id);
	}

	@Override
	public Disciplina consultarPorId(long id) {
		DisciplinaDAO dao = new DisciplinaDAO(em);
		try {
			Settings settings = new Settings();
			Disciplina d = dao.consultarPorId(id);
			// Atualizar status da disciplina
			int dtI = d.getDtInicio().compareTo(settings.getDataServidor());
			int dtF = d.getDtFim().compareTo(settings.getDataServidor());
			boolean nStatus = false;
			try {
				if (dtI <= 0 && dtF >= 0)
					nStatus = true;
				else if (dtI >= 0 || dtF <= 0)
					nStatus = false;
				else
					nStatus = false;
			} catch (Exception ex) {
				nStatus = false;
			}
			if (d.getStatus() != nStatus) {
				d.setStatus(nStatus);
				salvar(d);
			}
			return d;
		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public List<Disciplina> listar(String nome, String semestre) {
		DisciplinaDAO dao = new DisciplinaDAO(em);
		Settings settings = new Settings();
		try {
			List<Disciplina> disciplinas = dao.listar(nome, semestre);
			// Atualizar status das disciplinas
			for (int i = 0; i < disciplinas.size(); i++) {

				int dtI = disciplinas.get(i).getDtInicio()
						.compareTo(settings.getDataServidor());
				int dtF = disciplinas.get(i).getDtFim()
						.compareTo(settings.getDataServidor());
				boolean nStatus = false;
				try {
					if (dtI <= 0 && dtF >= 0)
						nStatus = true;
					else if (dtI >= 0 || dtF <= 0)
						nStatus = false;
					else
						nStatus = false;
				} catch (Exception ex) {
					nStatus = false;
				}
				if (disciplinas.get(i).getStatus() != nStatus) {
					disciplinas.get(i).setStatus(nStatus);
					salvar(disciplinas.get(i));
				}
			}
			return disciplinas;
		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public List<Usuario> listarProressores() {
		DisciplinaDAO dao = new DisciplinaDAO(em);
		try {
			return dao.listarProfessores();
		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public List<Disciplina> disciplinasProfId(long id, String nome,
			String semestre) {
		DisciplinaDAO dao = new DisciplinaDAO(em);
		try {
			return dao.disciplinasProfId(id, nome, semestre);
		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public Disciplina disciplinaConteudos(long id) {
		DisciplinaDAO dao = new DisciplinaDAO(em);
		try {
			return dao.disciplinaConteudos(id);
		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public Disciplina disciplinaProvas(long id) {

		DisciplinaDAO dao = new DisciplinaDAO(em);
		Settings settings = new Settings();
		ProvaBean provaBean = new ProvaBean();
		try {
			Disciplina disciplina = dao.disciplinaProvas(id);

			// Atualizar status das provas
			for (int i = 0; i < disciplina.getProvas().size(); i++) {

				int dtI = disciplina.getProvas().get(i).getDtAbertura()
						.compareTo(settings.getDataServidor());
				int dtF = disciplina.getProvas().get(i).getDtEncerramento()
						.compareTo(settings.getDataServidor());
				boolean nStatus = false;
				try {
					if (dtI <= 0 && dtF >= 0)
						nStatus = true;
					else if (dtI >= 0 || dtF <= 0)
						nStatus = false;
					else
						nStatus = false;
				} catch (Exception ex) {
					nStatus = false;
				}
				if (disciplina.getProvas().get(i).getStatus() != nStatus) {
					disciplina.getProvas().get(i).setStatus(nStatus);
					provaBean.salvar(disciplina.getProvas().get(i));
				}
			}
			return disciplina;

		} catch (Exception e) {
			return null;
		}
	}

}
